جزوه · فصل نهم · جلسه ۸۹ · استفاده از case و select ← بازگشت به فهرست
📘 فصل نهم · جلسه ۸۹ استفاده از case و select
📅 تاریخ: پنجشنبه، ۴ شهریور ۱۴۰۵ 👤 مدرس: محمد عابدینی 🐚 Zsh · 🐧 Debian (کالی) · 📦 Red Hat
این جلسه یکی از مباحث مهم در اسکریپت‌نویسی است. دستورات case و select برای ایجاد منوها و انتخاب‌های چندگانه بسیار کاربردی هستند و در آزمون‌های عملی مطرح می‌شوند.
🎮 قبل از شروع، یه مثال ساده:

فرض کن یه منوی رستوران داری که به کاربر چندین گزینه میده: پیتزا، برگر، سالاد یا خروج. به‌جای اینکه با کلی if این کار رو انجام بدی، می‌تونی از case استفاده کنی که خیلی تمیزتر و سریع‌تره. همچنین با select می‌تونی یه منوی حرفه‌ای با شماره‌گذاری خودکار بسازی. این جلسه بهت یاد میده چطور از این دو ابزار قدرتمند استفاده کنی!

▍ چرا از case استفاده کنیم؟

فرض کنید می‌خواهید چندین حالت مختلف را برای یک ورودی بررسی کنید. مثلاً کاربر یک دستور وارد می‌کند و شما باید بر اساس آن، کار مشخصی انجام دهید.

❌ روش با if (بد)

  • کد طولانی و نامرتب
  • تکرار زیاد if و elif
  • خوانایی پایین
  • اشتباهات بیشتر

✅ روش با case (خوب)

  • کد کوتاه و مرتب
  • ساختار مشخص و خوانا
  • مدیریت آسان حالت‌های مختلف
  • قابلیت استفاده از الگوها (Patterns)
🔑 نکته کلیدی: case برای زمانی که می‌خواهید یک متغیر را با چندین مقدار مختلف مقایسه کنید، بهترین گزینه است.

▍ ساختار case در Bash

case $variable in مقدار۱) دستورات مربوط به مقدار۱ ;; مقدار۲) دستورات مربوط به مقدار۲ ;; *) دستورات پیش‌فرض (هیچکدام) ;; esac

نکات مهم:

▍ مثال ۱: منوی ساده با case

این اسکریپت یک منوی ساده برای مدیریت شبکه ایجاد می‌کند:

#!/bin/bash # منوی مدیریت شبکه با case echo "ip | link | route | exit" read CHOICE case "$CHOICE" in ip) ip addr show ;; link) ip link show ;; route) ip route show ;; exit) echo "خروج" ;; *) echo "دستور نامعتبر" ;; esac
┌──(ya3in㉿kali)-[~] └─$ ./case2.sh ip | link | route | exit ip 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN ... 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP ... └─$ ./case2.sh ip | link | route | exit link 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN ... 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP ... └─$ ./case2.sh ip | link | route | exit test دستور نامعتبر

توضیح: کاربر یکی از گزینه‌ها را وارد می‌کند و case بر اساس آن، دستور مربوطه را اجرا می‌کند. اگر گزینه نامعتبر باشد، پیام «دستور نامعتبر» چاپ می‌شود.

نکته: در case می‌توانید از الگوهای مانند y|Y|yes|Yes برای پوشش چندین حالت استفاده کنید.

▍ دستور select چیست؟

select یک دستور فوق‌العاده در Bash است که به شما امکان می‌دهد یک منوی عددی با گزینه‌های مشخص ایجاد کنید. کاربر با وارد کردن شماره گزینه، انتخاب خود را انجام می‌دهد.

💡 نکته: select به صورت خودکار گزینه‌ها را شماره‌گذاری می‌کند و انتخاب کاربر را در متغیر REPLY ذخیره می‌کند.

• ساختار select

select variable in گزینه۱ گزینه۲ گزینه۳ ... do دستورات done

• مثال ساده با select

#!/bin/bash # منوی انتخاب شخصیت‌ها PS3="Enter a number: " select character in Sheldon Leonard Penny Howard Raj do echo "Selected character: $character" echo "Selected number: $REPLY" done
┌──(ya3in㉿kali)-[~] └─$ ./select1.sh 1) Sheldon 2) Leonard 3) Penny 4) Howard 5) Raj Enter a number: 3 Selected character: Penny Selected number: 3 Enter a number: 1 Selected character: Sheldon Selected number: 1 Enter a number: 6 Selected character: Selected number: 6 Enter a number: ^C

توضیح:

نکته: PS3 مخفف Prompt String 3 است و برای تنظیم پیام راهنما در select استفاده می‌شود.

▍ ترکیب select با case و if

این مثال ترکیبی از select و if است که یک منوی حرفه‌ای برای مدیریت شبکه ایجاد می‌کند:

#!/bin/bash # منوی حرفه‌ای با select و if PS3="Select option: " select CMD in "Show IP" "Show Interfaces" "Show Routes" "Exit" do if [ "$REPLY" -eq 1 ]; then ip addr show elif [ "$REPLY" -eq 2 ]; then ip link show elif [ "$REPLY" -eq 3 ]; then ip route show elif [ "$REPLY" -eq 4 ]; then echo "Bye" break else echo "Invalid selection" fi done
┌──(ya3in㉿kali)-[~] └─$ ./select2.sh 1) Show IP 2) Show Interfaces 3) Show Routes 4) Exit Select option: 2 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN ... 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP ... Select option: 4 Bye

توضیح:

▍ ترکیب select با case (روش بهتر)

روش بهتر این است که از case به جای if استفاده کنید تا کد تمیزتر و خواناتر باشد:

#!/bin/bash # منوی حرفه‌ای با select و case PS3="Select option: " select CMD in "Show IP" "Show Interfaces" "Show Routes" "Exit" do case $REPLY in 1) ip addr show ;; 2) ip link show ;; 3) ip route show ;; 4) echo "Bye" break ;; *) echo "Invalid selection" ;; esac done
نکته: ترکیب select و case یکی از بهترین روش‌ها برای ایجاد منوهای حرفه‌ای در اسکریپت‌های Bash است.

▍ جدول مقایسه case و select

ویژگی case select
کاربرد اصلی مقایسه یک مقدار با چندین الگو ایجاد منوی عددی با گزینه‌ها
ورودی کاربر متن (دستور، رشته، ...) شماره گزینه
شماره‌گذاری خودکار ❌ خیر (خودتان مدیریت می‌کنید) ✅ بله (به صورت خودکار)
حالت پیش‌فرض *) بررسی $REPLY با if یا case
خروج از حلقه نیاز به break ندارد با break
استفاده از الگوها ✅ بله (مثل y|Y|yes) ❌ خیر

▍ جمع‌بندی و نکات مهم

✅ جمع‌بندی نهایی:
  • case → برای مقایسه یک مقدار با چندین الگوی مختلف.
  • select → برای ایجاد منوی عددی با گزینه‌های مشخص.
  • case با esac و هر حالت با ;; خاتمه می‌یابد.
  • select با do شروع و با done خاتمه می‌یابد.
  • PS3 → پرامپت منو در select.
  • REPLY → شماره انتخاب‌شده در select.
  • break → برای خروج از حلقه select.
  • *) → حالت پیش‌فرض در case.
📝 تمرین پیشنهادی:

یک اسکریپت بنویسید که:

  • با select یک منو با گزینه‌های «سلام»، «تاریخ»، «اطلاعات سیستم» و «خروج» ایجاد کند.
  • با case انتخاب کاربر را پردازش کند.
  • برای گزینه «خروج» از break استفاده کند.
  • اگر کاربر عدد نامعتبر وارد کرد، پیام «گزینه نامعتبر» چاپ کند.